﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Data;
using CapaLogica.CL.Bitacora;
using System.Net;
using System.Net.Mail;
using CapaLogica.CL.PeriodoLectivo;



namespace CapaLogica.CL.UtilidadesGenerales
{

    public  class Modulo
    {

        public static void setearCadenaDeconexion(String pCadena){

            AcessoBD.StringConexion  = pCadena; 
        }


        internal String strinCon()
        {
            return "Data Source=SAFSDB2.mssql.somee.com;Initial Catalog=SAFSDB2;Persist Security Info=False;User ID=safs1234_SQLLogin_1;Password=bgijaxnozu;Packet Size=4096;Workstation ID=SAFSDB2.mssql.somee.com";

        }

 
        internal static bool insertarBitacora(int pIdUsuario, String pDescrip, int pIdEntidadAfectada, int pTipoEntidad, int pAccion)
        {
            {
                try
                {
                    AcessoBD accBd = new AccesoBD.AcessoBD();
                    String sql = @"insert into dbo.T_Bitacora(id_usuario, descripcion, id_entidad_afectada, id_accion, id_tipo_entidad)
                            values (param1, param2, param3, param4, param5)";

                    Parametros[] parametros = new Parametros[5];
                    parametros[0] = new Parametros(pIdUsuario, "param1");
                    parametros[1] = new Parametros(pDescrip, "param2");
                    parametros[2] = new Parametros(pIdEntidadAfectada, "param3");
                    parametros[3] = new Parametros(pAccion, "param4");
                    parametros[4] = new Parametros(pTipoEntidad, "param5");

                    accBd.executeSQL(sql, parametros);
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
        }

        internal static void insertarBitacoraParaTransaccion(SqlTransaction pTransaccion,
                                                          int pIdUsuario, String pDescrip, int pIdEntidadAfectada,
                                                          int pTipoEntidad, int pAccion)
        {
            try
            {
                AcessoBD _acceso = new AcessoBD();
                String sql = @"insert into dbo.T_Bitacora(id_usuario, descripcion, id_entidad_afectada, id_accion, id_tipo_entidad)
                            values (param1, param2, param3, param4, param5)";

                Parametros[] parametros = new Parametros[5];
                parametros[0] = new Parametros(pIdUsuario, "param1");
                parametros[1] = new Parametros(pDescrip, "param2");
                parametros[2] = new Parametros(pIdEntidadAfectada, "param3");
                parametros[3] = new Parametros(pAccion, "param4");
                parametros[4] = new Parametros(pTipoEntidad, "param5");

                _acceso.executeSQLInsertTransation(pTransaccion, sql, parametros);

            }
            catch (Exception)
            {

                throw;
            }


        }

        internal static void comparaListas(List<int> plistaAp, List<int> plistaBD, string pconsultaUpdate,
                    string pconsultaInsert, Parametros[] plistaUpdate, Parametros[] plistaInsert,EsBitacora objBitacora, SqlTransaction tran)
        {


            //Lista de acciones a ejecutar a 
            Dictionary<int, int> listaAcciones = new Dictionary<int, int>();
            bool banderaInsert;
            bool banderaDelete;
            bool compAP_BD = plistaAp != null && plistaAp.Count > 0;
            bool compBD_AP = plistaBD != null && plistaBD.Count > 0;
            AcessoBD _acceso = new AcessoBD();

            //Limpia la lista de acciones
            listaAcciones.Clear();

            //Compara la listaAP contra la listaBD
            if (compAP_BD)
            {
                //Compara listaAp
                for (int i = 0; i < plistaAp.Count; i++)
                {
                    banderaInsert = true;
                    if (plistaBD != null)
                    {
                        for (int y = 0; y < plistaBD.Count; y++)
                        {
                            //Si hay diferencias lo agregar como inserción
                            if (plistaAp[i] == plistaBD[y])
                            {
                                banderaInsert = false;
                            }
                        }

                        if (banderaInsert)
                        {
                            //Se agrega a la lista de acciones el codigo, 1=inserción
                            listaAcciones.Add(plistaAp[i], 1);
                        }
                    }
                    else
                    {
                        //Se agrega a la lista de acciones el codigo, 1=inserción
                        listaAcciones.Add(plistaAp[i], 1);
                    }
                }
            }

            //Compara la listaBD contra la listaAP
            if (compBD_AP)
            {
                //Compara listaBD
                for (int z = 0; z < plistaBD.Count; z++)
                {
                    banderaDelete = true;
                    if (plistaAp != null)
                    {
                        for (int t = 0; t < plistaAp.Count; t++)
                        {
                            //Si hay diferencias lo agregar como inserción
                            if (plistaBD[z] == plistaAp[t])
                            {
                                banderaDelete = false;
                            }
                        }

                        if (banderaDelete)
                        {
                            //Se agrega a la lista de acciones el codigo,2=update
                            listaAcciones.Add(plistaBD[z], 2);
                        }
                    }
                    else
                    {
                        //Se agrega a la lista de acciones el codigo,2=update
                        listaAcciones.Add(plistaBD[z], 2);
                    }
                }
            }

            //Determina el tipo de accion

            bool isTran = tran != null;
            SqlConnection conexion = isTran? tran.Connection: _acceso.GetConnection();
            if (!isTran)
            {
                conexion.Open();
            }
            SqlTransaction transaction = isTran ? tran : conexion.BeginTransaction(IsolationLevel.ReadCommitted);
            

            try
            {

                foreach (KeyValuePair<int, int> accion in listaAcciones)
                {
                    //Realizar el insert codigo 1
                    if (accion.Value == 1)
                    {
                        //Le agregar el parametro del id que se agregara de ultimo
                        plistaInsert[plistaInsert.Length - 1] = new Parametros(accion.Key, "param" + plistaInsert.Length);
                        _acceso.executeSQLInsertTransation(transaction, pconsultaInsert, plistaInsert);
                        //Inserta en la bitocora
                        insertarBitacoraParaTransaccion(transaction, objBitacora.IdUsuario, "Se inserta el registro " + accion.Key, accion.Key, Convert.ToInt32(objBitacora.Tipo), 1);
                    }

                    //Realiza el update codigo 2
                    else if (accion.Value == 2)
                    {
                        //Le agregar el id de la relacion a actualizar de ultimo
                        plistaUpdate[plistaUpdate.Length - 1] = new Parametros(accion.Key, "param" + plistaUpdate.Length);
                        _acceso.executeSQLTransation(transaction, pconsultaUpdate, plistaUpdate);
                        //Inserta en la bitocora
                        insertarBitacoraParaTransaccion(transaction, objBitacora.IdUsuario, "Se elimina el registro " + accion.Key, accion.Key, Convert.ToInt32(objBitacora.Tipo), 2);
                        
                    }
                }

                //Realiza la confirmación de la transacción
                transaction.Commit();
            }
            catch (Exception ex)
            {
                //Reversa la transacción
                transaction.Rollback();
                throw ex;
            }
            finally
            {
                //Cierra la conexion
                conexion.Close();
            }

        }

        internal static string MD5Encriptar(string value)
        {
            MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();

            byte[] data = System.Text.Encoding.ASCII.GetBytes(value);
            data = provider.ComputeHash(data);

            string md5 = string.Empty;

            for (int i = 0; i < data.Length; i++)
                md5 += data[i].ToString("x2").ToLower();

            return md5;
        }



        internal static string Encriptar(string pwd, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pwd);
            string key = "golondrinas_ticas";


            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd5.Clear();
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            //llave algoritmo tripleDES
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray =cTransform.TransformFinalBlock(toEncryptArray, 0,toEncryptArray.Length);
            tdes.Clear();
            string result= Convert.ToBase64String(resultArray, 0, resultArray.Length);
            return result;
        }


        internal static string Desifrar(string pwd, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Convert.FromBase64String(pwd);
            string key = "golondrinas_ticas";


            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd5.Clear();
            }
            else
            {
                keyArray = UTF8Encoding.UTF8.GetBytes(key);
            }

            //llave algoritmo tripleDES
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(
                                 toEncryptArray, 0, toEncryptArray.Length);           
            tdes.Clear();
            return UTF8Encoding.UTF8.GetString(resultArray);
        }

        internal static void LogError(int pidUsuario, string pproceso, string pEx)
        {
            AcessoBD accBd = new AccesoBD.AcessoBD();
            string sqlQuery = "Insert into T_Log_Error (id,id_usuario,mensaje,proceso) values(param1,getdate(),param2,param3)";
            Parametros[] listaParms=new Parametros [2];
            listaParms[0] = new Parametros(pidUsuario,"param1");
            listaParms[1] = new Parametros (pproceso,"param2");
            listaParms[1] = new Parametros(pEx, "param3");

            //Inserta el registro de error
            accBd.executeSQLInsert(sqlQuery,listaParms);

        }

        public static void cerrar_periodo(){

            try
            {

                String sps = "auto_cerrar_periodo";
                String sps2 = "sp_lista_correos_temas";
                AccesoBD.AcessoBD Acceso = new AccesoBD.AcessoBD();
                PeriodoPersistente peridoPer = new PeriodoPersistente();
                int id = peridoPer.obtenerPeriodoActual().Id;
                Parametros[] listaParms = new Parametros[2];
                listaParms[0] = new Parametros(id, "id_periodo");
                listaParms[1] = new Parametros(1, "id_usuario");

                SqlDataReader reader = Acceso.execute_SP_Consulta(sps, listaParms);
                int ind = 0;
                while (reader.Read())
                {
                    ind = reader.GetInt32(reader.GetOrdinal("indi_per"));
                }
                reader.Close();

                List<string> listaCorreos = new List<string>();

                if (ind == 0)
                {

                    SqlDataReader reader2 = Acceso.execute_SP_Consulta(sps2, null);
                    while (reader2.Read())
                    {
                        listaCorreos.Add(reader2.GetString(reader2.GetOrdinal("correo")));
                    }
                    reader2.Close();

                    for (int i = 0; i < listaCorreos.Count; i++)
                    {
                        enviarCorreoTemas(listaCorreos[i]);
                    }

                }
            }
            catch(Exception ex) {
                throw ex;
            }
        }

        internal static void enviarCorreo(string pClave,string pcorreoPara) {

    String CssStyleTable = "border-collapse:collapse;";
    String CssStyleTable2="border:1px dashed #069;padding:10px;background:#e8e8e8;width:500px;margin:0 25px";
    String CssStyleH1 = "font-family: Helvetica, sans-serif; font-size:24px; font-weight:normal; color:#555; border-bottom: 1px solid #ddd; margin:0;";
    String CssStyleTh = "font-family: Helvetica, sans-serif; font-size:12px; font-weight:bold; color:#333; text-align:right; padding:3px;";
    String CssStyleTd = "font-family: Helvetica, sans-serif; font-size:14px; font-weight:normal; color:#333; text-align:left; padding:3px;";
    String HtmlTop = "<br/><br/><div><div style='margin-left:33px;'><img src='http://educacionarte.com/wp-content/uploads/2012/03/cenfotec.jpg' alt='Header' width='460' height='130' /><div style='background-color:#f5f5f5; padding:5px; width:570px;'>";
    String HtmlBot = "</div></div><img src='https://www.gruponacion.biz/sv/images/email/footer-tail.jpg' alt='Footer' width='646' height='87'/></div>";
    String CssStyleH3="font-family: Helvetica, sans-serif; font-size:12px; font-weight:bold; color:#069; text-align:center; padding:3px;";
    String CssStyleTd2 = "font-family: Helvetica, sans-serif; font-size:12px; font-weight:normal; color:#333; text-align:left; padding:3px;";
	
	
	String Subject = "Credenciales SAFS";
    String HtmlText = HtmlTop + "<h1 style='" + CssStyleH1 + "'>" + Subject + "</h1>" +
            "<p>Estimado usuari@ se le suministran los datos de acceso a la aplicaci&oacute;n de SAFS</p>" +
            "<table style='" + CssStyleTable + "'><tr>" +
            "<th style='" + CssStyleTh + "'>Usuario: </th>" +
            "<td style='" + CssStyleTd + "'>" + pcorreoPara + "</td></tr><tr>" +
            "<th style='" + CssStyleTh + "'>Clave: </th>" +
            "<td style='" + CssStyleTd + "'>" + pClave + "</td></tr></table>" + HtmlBot;

    email(HtmlText,pcorreoPara);
   }

        internal static void enviarCorreoTemas(String correoPara)
        {

       String CssStyleTable = "border-collapse:collapse;";
       String CssStyleTable2 = "border:1px dashed #069;padding:10px;background:#e8e8e8;width:500px;margin:0 25px";
       String CssStyleH1 = "font-family: Helvetica, sans-serif; font-size:24px; font-weight:normal; color:#555; border-bottom: 1px solid #ddd; margin:0;";
       String CssStyleTh = "font-family: Helvetica, sans-serif; font-size:12px; font-weight:bold; color:#333; text-align:right; padding:3px;";
       String CssStyleTd = "font-family: Helvetica, sans-serif; font-size:14px; font-weight:normal; color:#333; text-align:left; padding:3px;";
       String HtmlTop = "<br/><br/><div><div style='margin-left:33px;'><img src='http://educacionarte.com/wp-content/uploads/2012/03/cenfotec.jpg' alt='Header' width='460' height='130' /><div style='background-color:#f5f5f5; padding:5px; width:570px;'>";
       String HtmlBot = "</div></div><img src='https://www.gruponacion.biz/sv/images/email/footer-tail.jpg' alt='Footer' width='646' height='87'/></div>";
       String CssStyleH3 = "font-family: Helvetica, sans-serif; font-size:12px; font-weight:bold; color:#069; text-align:center; padding:3px;";
       String CssStyleTd2 = "font-family: Helvetica, sans-serif; font-size:12px; font-weight:normal; color:#333; text-align:left; padding:3px;";


       String Subject = "Temas abiertos";
       String HtmlText = HtmlTop + "<h1 style='" + CssStyleH1 + "'>" + Subject + "</h1>" +
               "<p>Usted tiene temas abiertos y el período lectivo ya finalizo, favor cerrarlos.</p>" + HtmlBot;

       email(HtmlText,correoPara);
   }

        internal static void email(String mensaje, String correoPara) {

            string servidor = "smtp.gmail.com";
            MailMessage enviar_mensaje = new MailMessage("safscenfo@gmail.com", correoPara, "Credenciales SAFS", mensaje);
            enviar_mensaje.IsBodyHtml = true;
            SmtpClient cliente = new SmtpClient(servidor);
            cliente.EnableSsl = false;
            cliente.UseDefaultCredentials = false;
            cliente.Port = 25;
            cliente.Credentials = new System.Net.NetworkCredential("safscenfo@gmail.com", "cenfo1234");
            cliente.Send(enviar_mensaje); 
        
        }


    }
}
